今天尝试在手机上接收温度和气压值,测量值来自板载的bmp180。其实用mbed开发,就算从空白项目开始也很简单,就是添加bmp180,nRF51822和BLE_API和mbed 4个lib而已。注意include的时候,文件名是大小写敏感滴!!
然后是BLE的一般流程,包括:
定义characteristic,包括UUID,数据承载变量,数据长度和权限(读,写,通知等)等
定义service,其实就是构造所有characteristic组成的列表
- GattCharacteristic weatherCharacteristic (BLE_UUID_WEATHER_CHARACTERISTIC, weatherdata, 1, WEATHER_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
- GattCharacteristic *weatherChars[] = {&weatherCharacteristic};
- GattService weatherService(BLE_UUID_WEATHER_CHARACTERISTIC, weatherChars, 1);
复制代码
然后在主函数中添加service就可以了。
以上这是属于GATT部分,和数据有关。而连接则是由GAP搞定,全部在主函数里面,如果考虑不多,只需要修改我们看到的设备名称就好了,下面代码中,只要修改第五行的字符串就可以了。
- // setup advertising
- ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
- ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
- ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
- (const uint8_t *)"BLEweather", sizeof("BLEweather") - 1);
- ble.setAdvertisingInterval(160);
- ble.startAdvertising();
复制代码
然后就是BMP180的流程了,首先在main函数里面初始化。这个是比较保险的初始化,其实测试完毕以后,只要bmp.init()这一句就够了。
- while(1) {
- if (bmp180.init() != 0) {
- printf("Error communicating with BMP180\n");
- } else {
- printf("Initialized BMP180\n");
- break;
- }
- wait(1);
- }
复制代码
在m_status_check_handle函数里面调用读温度和气压的函数,然后用ble.updateCharacteristicValue更新。这里用了buf和bff,看起来很浪费,不过人家sprintf和update的参数类型要求不一样(分别是char 和uint8),也只能这么干了
- //m_status_check_handle 函数代码
复制代码测试的时候没有使用redbear的app,所以直接传的是字符串。为了能循环更新数据,m_status_check_handle attach到ticker,2秒执行一次。如果在手机中打开notify,则每2秒会看到温度和气压数据。整个过程还是很顺利的。就是比较奇怪的是,最长只能接收20个字符??这是为啥
具体main.cpp见附件
main.cpp
(4.13 KB, 下载次数: 1)