台湾源码学习1

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出来以后就比较 然后用这个服务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值