|
蓝牙nrf51822源代码固件编译,使用上篇搭建的开发环境进行源代码的讲解和编译,下载到开发板中。
(电脑烧写开发板连线图)仿真+串口的接线。
一、固件源代码下载
网盘下载:http://pan.baidu.com/s/1eSjsObo
二、源代码目录结构。
services目录里ble_wechat_service.c主要是通信服务功能。
products目录里mpbledemo2.c是airsync验证授权按键收发功能等。
source目录里main.c是入口函数,代码从这里开始走起。
common目录里是一些公用的部分,md5/aes等等
其它代码主要都是官方ble的sdk代码,也采用轮寻的一个小系统,有兴趣可以研究一下。
同时我们也提供纯的ble项目代码,不含airsync,大家就可以知道app如何和ble交互了,以后会做扩展篇。
三、源代码讲解
源代码我们主入口main开始,为大家一一解说。双击main.c,声明了m_ble_wechat(微信协议),m_mpbledemo2_handler(数据事件)。
然后进行resource_init资源初始化,advertising_start(蓝牙广播)。
最后进入数据事件轮循,让ble运行。
点击resource_init,再按F12自动跳转到函数,如上图。
uart_init()串口初始化。
timers_init()定时器初始化
gpiote_init()io针脚初始化
buttons_init()按钮初始化
ble_stack_init()蓝牙协议践初始化
get_mac_addr(m_addl_adv_manuf_data)获取mac地址等等...
这里我们主要关心,串口调试要用到最多的,io针脚控制灯开关的,buttons按钮,其它很多都是ble系统内部的,我们只要会用就可以了。
在uart_init按F12,跳转到uart_init的函数里,因为串口输入做为最重要的调试日志。
在这里设置了串口的脚针,串口的波特率UART_BAUDRATE_BAUDRATE_Baud9600。
在buttons_init按F12,跳转到buttons_init的函数里,这里设置了二个按键,一个重启、一个botton1。
在ble_stack_init按F12,跳转到协议践的初始化,看到代码将m_ble_wechat、m_mpbledemo2_handler引入,然后on_ble_evt(p_ble_evt)这个函数处理事件,比如蓝牙连接事件,断开事件,发送数据事件,下图我们看看业务类的各个函数声明。
这个就是微信业务处理的各个函数,在main()里也一直请求m_data_main_process_func函数。
mpbledemo2_data_consume_func,如上图,这个函数接收微信发来的处理,进行验证然后解析,判断是openLightPush就开灯,是closeLightPush就关灯的处理。
做扩展功能可以在这里进行修改,如果是别的值就做别的事。
mpbledemo2_button_handler,这个函数处理按键点击后,执行发送信息给微信的实例,仿这个做成传感器传数据就可以啦。
最重要的源代码就是上面讲的这些,想深入研究可以了解ble协议践吧,加油。
四、DeviceID和DeviceType申请和配置
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
点击登陆,然后使用个人微信扫描登陆。
先添加一款产品,找到设置,点击进入。
添加产品,然后填写相关信息,选择蓝牙,以后我们做Wifi时再选择wifi哦。
申请成功后,点击产品详情,会看到产品编号,记住它。
在上面获取账号appID、appsecret。
http://mp.weixin.qq.com/debug/,打开微信公众平台接口调试工具。
输入appID、appsecret,获取access_token,后面会使用到这个值。
选择:硬件接入api接口调试,设备授权-获取deviceid和二维码 /device/getqrcode,输入access_token。
点击检查问题后,会看到"errcode": 100020, "errmsg": "account quota not enough"
这是因为新版本需要输入&product_id=xxxx,就是上面我们申请得到的产品编号10114(要填写自己的哦)
复制https://api.weixin.qq.com/device/getqrcode?access_token=7olhdCJrKFWLots92V0YIq6Oaxj9JHKLj3t41zqnkw8QNky61_g6a550QsT51_ue1x5ekUN0T48ishysQsR0Dls9xW7elU44fdLDhvwEk7BWEvHcXrZRnQIQw0pfRIvFUXDcAIAZCI&product_id=10114(复制你自己生成的哦),后面是添加&product_id=10114(自己的产品编号),用另一个网页选项卡打开,会返回下面的json格式。
{"base_resp":{"errcode":0,"errmsg":"ok"},"deviceid":"gh_0c61a2431300_9886c60e32d1eeff","qrticket":"http:\/\/we.qq.com\/d\/AQDOu5W-_BTxnVphy1Ew-SZRjz3fd6nTFwvm1_qO"}
那么这样就成功获取到deviceid,qrticket(到二维码网站生成就可以扫描了)
选择:硬件接入api接口调试,设备授权-利用deviceid更新设备属性 device/authorize_device,填写下面的代码
{
"device_num": "1",
"device_list": [
{
"id": "gh_0c61a2431300_9886c60e32d1eeff",
"mac": "D28403895E11",
"connect_protocol": "3",
"auth_key": "",
"close_strategy": "1",
"conn_strategy": "1",
"crypt_method": "0",
"auth_ver": "0",
"manu_mac_pos": "-1",
"ser_mac_pos": "-2"
}
],
"op_type": "1",
"product_id": "10114"
}
这里要注意,id就是deviceid,mac是开发板的mac地址(下面教大家如何获取),product_id是您申请的id。
获取mac,先去搜索lightBlue软件APP(苹果)
安卓:http://pan.baidu.com/s/1eSDKPRc (android下载安装运行,在首页就能看到mac地址了)
运行,开发板上电后,会看到蓝牙4.0的列表,点击联接。
看到0xFEC9的Read字段,就是mac地址啦。
看到OxD28403895E11,就是要的mac地址。
{
"button":[
{
"type":"click",
"name":"点灯",
"key":"V1001_LIGHT_ON",
"sub_button":[]
},
{
"type":"click",
"name":"灭灯",
"key":"V1001_LIGHT_OFF",
"sub_button":[]
}
}
这一步是让公众号生成菜单,成功以后重新进入公众号就能看到菜单了。
{"device_id":"gh_0c61a2431300_40687af62461527e","openid":"ozruVv7ujVGDkPGkFdD4ymVBdfQw"}
强制解绑,要输入device_id和openid,openid在测试公众号里面的 "用户列表" 可以看到。
(这个功能一般不用,有时绑定了多个硬件,可以用这个方法解绑)
五、编译固件、下载到蓝牙开发板
编译固件之前,需要刷写ble的协议浅(你可以理解为底层固件)。
运行nRFgo Studio软件,选择nRF51 Programming,选择SEGGER to USE,点击Program SoftDevice,点击Browse选择"蓝牙demo源代码V3\softdevice"目录里的s110_nrf51822_5.2.1_softdevice.hex,点击Program进行刷写。
接下来在源代码里设置参数值,准备APPlication的编译,双击comsource.c,右击打开comsource.h头文件
看到
#define RX_PIN_NUMBER 11
#define TX_PIN_NUMBER 9
#define LED0 20
#define SYS_RESET 19
先要设置一下串口脚针,和按键io针脚,要看好开发板的原理图,我们板的io针脚如上图设置。
双击mpbledemo2.c,右击打开mpbledemo2.h头文件
#define DEVICE_TYPE "gh_0c61a2431300"
#define DEVICE_ID "gh_0c61a2431300_abff4dbc6c022240"
#define EAM_md5AndNoEnrypt 1
修改成第4节申请获得的参数,DEVICE_TYPE就是微信原始id,DEVICE_ID就是deviceid,EAM_md5AndNoEnrypt使用md5不加入验证。
改成这样,在扫描二维码时才能对应上某个硬件。
设置编译参数,右击项目,Option for Target 'nrf51822'
设置板型号,选择nRF51822_xxAA。
设置IROM1和IRAM1数据,这一般在硬件参数文档datasheet有相关介绍。
选择J-LINK仿真器,然后确定,之后就可以编译了,上图RAM for Algorithm要改成0x20002000(图上是错的)。
点击编译(或F7,Project->Build targets),然后点击下载(Flash->DownLoad),
看到Application running ...,下载到开发板里就成功了。
六、测试演示airsync蓝牙功能
airsyscndebug下载:http://pan.baidu.com/s/1mhMLPhA
airsyscndebug是一款专门测试airsyscn协议的app,目前只有安卓,使用它测试通过,那么说明协议就正常了。
点击列表蓝牙的ble(列表里也可以看到mac地址哦)。
点击设置,设置完成再点手动测试。
DEVICE_TYPE就是微信原始id,DEVICE_ID就是deviceid,还记得源代码里也要设置这个吗?一一对应哦。
点击手动测试,如果看到以上图,说明airsysnc协议正常,没有问题了。
我们运行“串口调试助手.exe”(以前都有说,没有百度下载吧)
在点手动测试时,串口数据会出现如上图,开发板以后的调试要靠串口数据(非常关键)
返回退出airsysncdebug界面,将第4节生成的二维码生成:http://cli.im/
打开微信,扫描二维码,然后确定绑定(如果以前绑定过,一直显示未绑定,可以强行解绑,再扫描一次第4节)
进入到公众号界面,会显示正在连接中,已连接等字样(我手机显示connected,如果一直显示正在连接,未连接.....,请重上电开发板和微信多试,经常有这样的问题,可能是微信测试服务号不稳定)
连接成功,同时串口调试助手会显示如上log,就是连接验证授权的成功过程了。
点击点灯,正常则显示已发送xxxxx(如果这时显示服务器不可用,那么公众号和服务器请求不成功,多试和检查服务器,如果显示未绑定请强行解绑再扫二维码一次)
这时开发板串口会收到如上数据,源代码解析数据后判断是开灯,就执行了开灯命令light on。
只要我们在这里改一下,就可以实现开门,关窗,发送各种命令(机器人的话就摇头晃脑命令咯),那开发板怎么把数据传给微信呢?下面我们用开发板按键模拟。
按下开发板上的k2按键,微信就会收到如上信息,
如果按键换成是传感器,微信收到的信息经过的我们部署的服务器时,我们就可以把数据保存到数据库进行用户数据分析,达到智能的概念了。
再看看串口数据,按键时会msg to send,我们设定默认是Hello,wechat!
然后微信收到后又响应发送了信息回来,这就是硬件和微信的交互了咯。
这就是微信发送给硬件开发板的API接口,我们也可以用JS调用呀,厉害了然后想怎么搞就行了。
硬件开发板发送数据给微信是使用蓝牙协议的,在源代码里有发送函数哦,更深入自己去研究吧,大神们。
常见问题(调试微信经常出现一些莫名的问题):
1、如何在公众号生成菜单?答:默认是不会在公众号生成菜单,上文就有具体生成菜单的操作方法。
2、在微信公众号开发DEMO的源代码上,菜单新增了url,调用无法生成?
答:动态实行是无法建立的,源代码的BUG问题,按上面方法手动改代码,直接生成,退出再登陆就看到了。
3、扫描二维码,显示连接中,然后断开又重新连接?
答:测试号经常有这样的问题,有时可以连有时又不可以连接,多试几次。
4、设备授权-device/authorize_device,需要注意些什么?
答:"connect_protocol": "3", 这个是3;"auth_key": ""使用加密需填写; "op_type": "1",1为新增;"product_id": "10114"产品编号。
5、开发板没有串口输出?
答:在固件源代码里,搜到如下设置正确您开发板的针脚。
#define RX_PIN_NUMBER 11 #define TX_PIN_NUMBER 9
请关注@智能创客 微信:znck007(打造DIY创客平台)
|
|