D:\git\dialog\6.0.10.511\projects\target_apps\ble_examples\mCube_mc36xx_data_notifcation\src\config\user_callback_config.h
和node的这个对比 右边台湾基本一样!!!!!只是多了下面的3个回调函数
修改代码编译
修改点
1---电池电量 在协议中上传的就是固定的数据
uint8_t batt_test(void)
{
return 24;
}
2---版本号 修改bit的宏定义
// 0x0020 1100
uint32_t mc_get_version(void)
{
return((((uint32_t)VERSION_AlGORITHM_MAJOR) << 28) |
(((uint32_t)VERSION_AlGORITHM_MINOR) << 24) |
(((uint32_t)VERSION_AlGORITHM_BUILD) << 20) |
(((uint32_t)VERSION_INTERFACE_MAJOR) << 12) |
(((uint32_t)VERSION_INTERFACE_MINOR) << 8) |
(((uint32_t)VERSION_INTERFACE_BUILD) << 4));
}
3--修改名字
前面写过广播的CSDN 这里 USER_DEVICE_NAME
广播就是 app_easy_gap_undirected_advertise_start_create_msg
app_easy_gap_non_connectable_advertise_start_create_msg
app_easy_gap_undirected_advertise_start_create_msg
你关注 USER_DEVICE_NAME 会发现使用它的地方
A 广播的时候 我已经del一个 那个不可链接的函数del 我们不需要
B 拷贝在一个结构体 然后等着被调用 具体啥时候 我们很被动 暂时不知道(马上就知道了)
修改一下
/// Device name
#define USER_DEVICE_NAME "MC_JAME_06"
#define USER_DEVICE_NAME2 "MC_KOBE_08"
/// Device name length
#define USER_DEVICE_NAME_LEN (sizeof(USER_DEVICE_NAME)-1)
static struct gapm_start_advertise_cmd* app_easy_gap_undirected_advertise_start_create_msg(void)
{
if(total_adv_space <= ADV_DATA_LEN)
{
append_device_name(&cmd->info.host.adv_data_len,
USER_DEVICE_NAME_LEN,
&(cmd->info.host.adv_data[cmd->info.host.adv_data_len]),
USER_DEVICE_NAME);-------------------------------------------------------------------------
}
else if (total_scan_space <= SCAN_RSP_DATA_LEN)
{
append_device_name(&cmd->info.host.scan_rsp_data_len,
USER_DEVICE_NAME_LEN,
&(cmd->info.host.scan_rsp_data[cmd->info.host.scan_rsp_data_len]),
USER_DEVICE_NAME2);-------------------------------------------------------------------------
}
}
void app_init(void)
{
device_info.dev_name.length = (USER_DEVICE_NAME_LEN <= GAP_MAX_NAME_SIZE) ? USER_DEVICE_NAME_LEN : GAP_MAX_NAME_SIZE;
memcpy(device_info.dev_name.name, USER_DEVICE_NAME, device_info.dev_name.length);
编译OK 夹具烧录OK D:\TSBrowserDownloads\DA145xx_SDK_for_handover\DA145xx_SDK\6.0.14.1114\projects\Izar\src\Node_Dialog_DA14531_SHENNONG\Keil_5\out_DA14531\Objects
手机APP可以看到 名字修改好了
点击连接 你看到了 有2个通用的必须的服务 这个服务包含的是BLE基础 有名字 这就是前面的问题 那个mamcpy是做这个的
继续看广播的内容吧
0x02010611079ECADC240EE5A9E093F3A3B50100406E0B094D435F4B4F42455F3038
现在分析一下
https://www.dialog-semiconductor.com/products/bluetooth-low-energy?post_id=11851#tab-support_tab_content 【type=1 貌似真的无法修改了】
整理一下广播内容
020106
11079ECADC240EE5A9E093F3A3B50100406E
0B094D435F4B4F42455F3038
它是LTV的结构 02 11 0B都是长度
TYPE的话 其中
01 是能不能连接 这个是ROM自己做的 没有代码
07 是宏定义的 是我们的服务的UUID
#define USER_ADVERTISE_DATA
"\x11"\
"\x07"\
"\x9E\xCA\xDC\x24\x0E\xE5\xA9\xE0\x93\xF3\xA3\xB5\x01\x00\x40\x6E"
#define ADV_TYPE_COMPLETE_LIST_128BIT_SERVICE_IDS "\x07"
#define ADV_TYPE_COMPLETE_LOCAL_NAME "\x09"
09 是设备的名字 它是函数操作的
static void append_device_name(uint8_t *len,
data[1] = GAP_AD_TYPE_COMPLETE_NAME;
GAP_AD_TYPE_COMPLETE_NAME = 0x09,
到这里广播就完成了 只广播了 连接性---UUID---名字
继续搞鬼 修改UUID我们比较长 看谷雨的视频用3就可以了
//#define USER_ADVERTISE_DATA ("\x11"\
// ADV_TYPE_COMPLETE_LIST_128BIT_SERVICE_IDS\
// "\x9E\xCA\xDC\x24\x0E\xE5\xA9\xE0\x93\xF3\xA3\xB5\x01\x00\x40\x6E")
#define USER_ADVERTISE_DATA ("\x03"\
ADV_TYPE_COMPLETE_LIST_16BIT_SERVICE_IDS\
"\x00\x01")
/// Advertising data length - maximum 28 bytes, 3 bytes are reserved to set
#define USER_ADVERTISE_DATA_LEN (sizeof(USER_ADVERTISE_DATA)-1)
看到 名字可以在广播了 不在那个扫描应答包了
https://blog.csdn.net/suxiang198/article/details/48521335/
https://wenku.baidu.com/view/05557c81561252d381eb6ead.html
测试一下开发板
static void mnf_data_init()
{
mnf_data.ad_structure_size = sizeof(struct mnf_specific_data_ad_structure ) - sizeof(uint8_t); // minus the size of the ad_structure_size field
mnf_data.ad_structure_type = GAP_AD_TYPE_MANU_SPECIFIC_DATA;
mnf_data.company_id[0] = APP_AD_MSD_COMPANY_ID & 0xFF; // LSB
mnf_data.company_id[1] = (APP_AD_MSD_COMPANY_ID >> 8 )& 0xFF; // MSB
mnf_data.proprietary_data[0] = 0;
mnf_data.proprietary_data[1] = 0;
}
可以看到 手机看到的广播 这就是诺基亚的设备!!!!
++++++++++++++++++++++++
生活中 荣耀6手环
餐厅的小米
小结
小米-----038F
华为-----027D
广播的flag是个谜 在dialog 中注释这3个字节没有代码 是在ROM的 那么怎么修改呢
不知道
小米 2 1 2
华为2 1 4
我们总是2 1 6
LTV的话 那就长度2 类型1 加上 小米华为
我们
下面的冒充 可以看到我们的flag是2个
补充---我们的node +开发板 都没有使用0X16的广播 而华为手环用0A16表达了MAC 小米0X16不知道干啥的
补充我们开发板的广播
++++++++++++++
这个多出来的广播是0XFF操作的
// Update the selected fields of the advertising data (manufacturer data)
memcpy(mnf_data_storage + (mnf_data_index & 0x7F), &mnf_data, sizeof(struct mnf_specific_data_ad_structure));
继续看外观 板子源码
/****************************************************************************************
* Values for the Appearance AD type in air format.
* See https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
****************************************************************************************/
#define ADV_APPEARANCE_UNKNOWN "\x00\x00" /* Unknown of unspecified appearance type */
#define ADV_APPEARANCE_GENERIC_PHONE "\x40\x00" /* Generic Phone */
#define ADV_APPEARANCE_GENERIC_COMPUTER "\x80\x00" /* Generic Computer */
#define ADV_APPEARANCE_GENERIC_WATCH "\xC0\x00" /* Generic Watch */
#define ADV_APPEARANCE_WATCH_SPORTS_WATCH "\xC1\x00" /* Sports Watch */
#define ADV_APPEARANCE_GENERIC_CLOCK "\x00\x01" /* Generic Clock */
#define ADV_APPEARANCE_GENERIC_DISPLAY "\x40\x01" /* Generic Display */
#define ADV_APPEARANCE_GENERIC_REMOTE_CONTROL "\x80\x01" /* Generic Remote Control */
#define ADV_APPEARANCE_GENERIC_EYE_GLASSES "\x0C\x01" /* Generic Eye Glasses */
#define ADV_APPEARANCE_GENERIC_TAG "\x00\x02" /* Generic Tag */
#define ADV_APPEARANCE_GENERIC_KEYRING "\x40\x02" /* Generic Keyring */
#define ADV_APPEARANCE_GENERIC_MEDIA_PLAYER "\x80\x02" /* Generic Media Player */
#define ADV_APPEARANCE_GENERIC_BARCODE_SCANNER "\xC0\x02" /* Generic Barcode Scanner */
#define ADV_APPEARANCE_GENERIC_THERMOMETER "\x00\x03" /* Generic Thermometer */
#define ADV_APPEARANCE_THERMOMETER_EAR "\x01\x03" /* Ear Thermometer */
#define ADV_APPEARANCE_GENERIC_HEART_RATE_SENSOR "\x40\x03" /* Generic Heart Rate Sensor */
#define ADV_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT "\x41\x03" /* Belt Heart Rate Sensor */
#define ADV_APPEARANCE_GENERIC_BLOOD_PRESSURE "\x80\x03" /* Generic Blood Pressure */
#define ADV_APPEARANCE_BLOOD_PRESSURE_ARM "\x81\x03" /* Arm Blood Pressure */
#define ADV_APPEARANCE_BLOOD_PRESSURE_WRIST "\x82\x03" /* Wrist Blood Pressure */
#define ADV_APPEARANCE_HUMAN_INTERFACE_DEVICE_HID "\xC0\x03" /* Human Interface Device (HID) */
#define ADV_APPEARANCE_KEYBOARD "\xC1\x03" /* Keyboard */
#define ADV_APPEARANCE_MOUSE "\xC2\x03" /* Mouse */
#define ADV_APPEARANCE_JOYSTICK "\xC3\x03" /* Joystick */
#define ADV_APPEARANCE_GAMEPAD "\xC4\x03" /* Gamepad */
#define ADV_APPEARANCE_DIGITIZER_TABLET "\xC5\x03" /* Digitizer Tablet */
#define ADV_APPEARANCE_CARD_READER "\xC6\x03" /* Card Read */
#define ADV_APPEARANCE_DIGITAL_PEN "\xC7\x03" /* Digital Pen */
#define ADV_APPEARANCE_BARCODE_SCANNER "\xC8\x03" /* Barcode Scanner */
#define ADV_APPEARANCE_GENERIC_GLUCOSE_METER "\x00\x04" /* Generic Glucose Meter */
#define ADV_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR "\x40\x04" /* Generic Running/Walking Sensor */
#define ADV_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE "\x41\x04" /* In Shoe Running/Walking Sensor */
#define ADV_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE "\x42\x04" /* On Shoe Running/Walking Sensor */
#define ADV_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP "\x43\x04" /* On Hip Running/Walking Sensor */
#define ADV_APPEARANCE_GENERIC_CYCLING "\x80\x04" /* Generic Cycling */
#define ADV_APPEARANCE_CYCLING_CYCLING_COMPUTER "\x81\x04" /* Cycling Computer */
#define ADV_APPEARANCE_CYCLING_SPEED_SENSOR "\x82\x04" /* Cycling Speed Senspr */
#define ADV_APPEARANCE_CYCLING_CADENCE_SENSOR "\x83\x04" /* Cycling Cadence Sensor */
#define ADV_APPEARANCE_CYCLING_POWER_SENSOR "\x84\x04" /* Cycling Power Sensor */
#define ADV_APPEARANCE_CYCLING_SPEED_AND_CADENCE_SENSOR "\x85\x04" /* Cycling Speed and Cadence Sensor */
#define ADV_APPEARANCE_PULSE_OXIMETER_GENERIC "\x40\x0C" /* Generic Pulse Oximeter */
#define ADV_APPEARANCE_PULSE_OXIMETER_FINGERTIP "\x41\x0C" /* Fingertip Pulse Oximeter */
#define ADV_APPEARANCE_PULSE_OXIMETER_WRIST_WORN "\x42\x0C" /* Wrist Worn Pulse Oximeter */
#define ADV_APPEARANCE_OUTDOOR_GENERIC "\x40\x14" /* Generic Outdoor */
#define ADV_APPEARANCE_OUTDOOR_LOCATION_DISPLAY_DEVICE "\x41\x14" /* Outdoor Location Display Device */
#define ADV_APPEARANCE_OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE "\x42\x14" /* Outdoor Location and Navigation Display Device */
#define ADV_APPEARANCE_OUTDOOR_LOCATION_POD "\x43\x14" /* Outdoor Location Pod */
#define ADV_APPEARANCE_OUTDOOR_LOCATION_AND_NAVIGATION_POD "\x44\x14" /* Outdoor Location and Navigation Pod */
#define ADV_DIALOG_MANUFACTURER_CODE "\x00\xD2"
网址已经打不开 我现在是0000 我修改为鼠标
上面的不对
device_info.appearance = 0X03C1;
device_info.appearance = 0X0004
这里都可以看到变化 但是真实的icon还是蓝牙----算了吧
修改MAC地址
*** BLE FUNCTIONS
*****************************************************************************/
void user_app_generate_static_random_addr(struct bd_addr *addr)
{
// Check if the static random address is already generated.
// If it is already generated the two MSB are equal to '1'
if (!(addr->addr[BD_ADDR_LEN - 1] & GAP_STATIC_ADDR))
{
uint8_t package;
uint32_t val1, val2;
uint32_t timestamp;
uint32_t tester, position, adc_single, adc_diff;
// Initialize OTP controller
hw_otpc_init();
hw_otpc_enter_mode(HW_OTPC_MODE_READ);
package = (GetWord32(OTP_HDR_PACKAGE_ADDR) & 0x000000FF);
position = GetWord32(OTP_HDR_POSITION_ADDR);
tester = (GetWord32(OTP_HDR_TESTER_ADDR) & 0x00FFFFFF);
timestamp = GetWord32(OTP_HDR_TIMESTAMP_ADDR);
adc_single = (otp_cs_get_adc_single_offset() << 16) | otp_cs_get_adc_single_ge();
adc_diff = (otp_cs_get_adc_diff_offset() << 16) | otp_cs_get_adc_diff_ge();
val1 = timestamp ^ position ^ adc_single;
val2 = tester ^ package ^ adc_diff;
hw_otpc_disable();
// Shuffle the bits to 'look' more random
val1 = hash(val1);
val2 = hash(val2);
// Assign unique address
// addr->addr[0] = val1 & 0xFF;
// addr->addr[1] = (val1 >> 8) & 0xFF;
// addr->addr[2] = (val1 >> 16) & 0xFF;
// addr->addr[3] = (val1 >> 24) & 0xFF;
// addr->addr[4] = val2 & 0xFF;
// addr->addr[5] = val2 >> 8;
// The two MSB shall be equal to '1'
//addr->addr[BD_ADDR_LEN - 1] |= GAP_STATIC_ADDR;
addr->addr[0] = 0x11;
addr->addr[1] = 0x22;
addr->addr[2] = 0x33;
addr->addr[3] = 0x44;
addr->addr[4] = 0x55;
addr->addr[5] = 0X66;
addr->addr[BD_ADDR_LEN - 1] =0XFF;
}
mc_debug("\r\n[MAC]:");
memcpy(&ble_mac_addr, &addr->addr, BD_ADDR_LEN*sizeof(uint8_t));
for (int8_t mac_addr_cnt = (BD_ADDR_LEN-1);mac_addr_cnt >= 0;mac_addr_cnt--) {
mc_debug_byte(ble_mac_addr[mac_addr_cnt]);
if (mac_addr_cnt > 0)
mc_debug(":");
}
}
那就是FF 55 44 33 22 11
看下图
这里在node体现了UUID一致性 那么网关如何来操作的呢 --看下面nus的 52840的服务就是这个UUID!!!!!!!9E CA---
现在我利用手上的开发板也来试试这个狸猫换太子
UUID我们本来是随机写的 现在我用nus来写 那么nrfconnect就会识别为一个官方的服务!
修改代码
// Service 1 of the custom server 1
#define DEF_SVC1_UUID_128 {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}
#define DEF_SVC2_UUID_128 {0x2F, 0x2A, 0x93, 0xA6, 0xBD, 0xD8, 0x41, 0x52, 0xAC, 0x0B, 0x10, 0x99, 0x2E, 0xC6, 0xFE, 0xED}
//#define DEF_SVC3_UUID_128 {0x2E, 0x2A, 0x93, 0xA6, 0xBD, 0xD8, 0x41, 0x52, 0xAC, 0x0B, 0x10, 0x99, 0x2E, 0xC6, 0xFE, 0xED}
#define DEF_SVC3_UUID_128 {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E} /**< Used vendor specific UUID. */
那么主机网关 是这么类似手机APP 点击这个服务的呢
它只有这样的一个服务
db_discovery_init();
ble_db_discovery_init(db_disc_handler); 这样回调注册的 discover出来以后就比较 然后用这个服务