Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface mbed-rtos mbed nsdl rgb_sensor_buffer
Fork of mbed_nsdl by
resources/beacon_resource.cpp@10:9c11a8889d62, 2014-12-05 (annotated)
- Committer:
- bjblazkowicz
- Date:
- Fri Dec 05 14:28:31 2014 +0000
- Revision:
- 10:9c11a8889d62
- Parent:
- 9:9d5b0c43579b
Use " instead of ' on the beacon json payload.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| bjblazkowicz | 9:9d5b0c43579b | 1 | #include <ctype.h> |
| bjblazkowicz | 9:9d5b0c43579b | 2 | #include "mbed.h" |
| bjblazkowicz | 9:9d5b0c43579b | 3 | #include "rtos.h" |
| bjblazkowicz | 9:9d5b0c43579b | 4 | #include "MODSERIAL.h" |
| bjblazkowicz | 9:9d5b0c43579b | 5 | #include "nsdl_support.h" |
| bjblazkowicz | 9:9d5b0c43579b | 6 | #include "beacon_resource.h" |
| bjblazkowicz | 9:9d5b0c43579b | 7 | #include "payload.h" |
| bjblazkowicz | 9:9d5b0c43579b | 8 | |
| bjblazkowicz | 9:9d5b0c43579b | 9 | #define RESOURCE_ID "sensor/beacon" |
| bjblazkowicz | 9:9d5b0c43579b | 10 | |
| bjblazkowicz | 9:9d5b0c43579b | 11 | extern MODSERIAL console; |
| bjblazkowicz | 9:9d5b0c43579b | 12 | |
| bjblazkowicz | 9:9d5b0c43579b | 13 | /* stored data for observable resource */ |
| bjblazkowicz | 9:9d5b0c43579b | 14 | static uint8_t obs_number = 0; |
| bjblazkowicz | 9:9d5b0c43579b | 15 | static uint8_t *obs_token_ptr = NULL; |
| bjblazkowicz | 9:9d5b0c43579b | 16 | static uint8_t obs_token_len = 0; |
| bjblazkowicz | 9:9d5b0c43579b | 17 | |
| bjblazkowicz | 9:9d5b0c43579b | 18 | static MODSERIAL beacon(p9, p10); |
| bjblazkowicz | 9:9d5b0c43579b | 19 | |
| bjblazkowicz | 9:9d5b0c43579b | 20 | #define UUID_LEN (36) |
| bjblazkowicz | 9:9d5b0c43579b | 21 | |
| bjblazkowicz | 9:9d5b0c43579b | 22 | static const char *UUID = "3AD81C9B-8B1A-494D-B0C3-C1B6DC87A2A8"; |
| bjblazkowicz | 9:9d5b0c43579b | 23 | |
| bjblazkowicz | 9:9d5b0c43579b | 24 | // |
| bjblazkowicz | 9:9d5b0c43579b | 25 | // A BLE beacon advertisement record |
| bjblazkowicz | 9:9d5b0c43579b | 26 | typedef struct { |
| bjblazkowicz | 9:9d5b0c43579b | 27 | char uuid[UUID_LEN + 1]; |
| bjblazkowicz | 9:9d5b0c43579b | 28 | int rssi; |
| bjblazkowicz | 9:9d5b0c43579b | 29 | int calibration; |
| bjblazkowicz | 9:9d5b0c43579b | 30 | int major; |
| bjblazkowicz | 9:9d5b0c43579b | 31 | int minor; |
| bjblazkowicz | 9:9d5b0c43579b | 32 | int channel; |
| bjblazkowicz | 9:9d5b0c43579b | 33 | } beacon_record_t; |
| bjblazkowicz | 9:9d5b0c43579b | 34 | |
| bjblazkowicz | 9:9d5b0c43579b | 35 | static beacon_record_t record = {0}; |
| bjblazkowicz | 9:9d5b0c43579b | 36 | |
| bjblazkowicz | 9:9d5b0c43579b | 37 | // Encode the beacon record as JSON. |
| bjblazkowicz | 9:9d5b0c43579b | 38 | void encode_beacon_record(const beacon_record_t *record, char *json, int *json_length) { |
| bjblazkowicz | 10:9c11a8889d62 | 39 | static const char *format = "{\"r\":%d, \"c\":%d,\"m\":%d,\"n\":%d,\"ch\":%d}"; |
| bjblazkowicz | 9:9d5b0c43579b | 40 | *json_length = sprintf(json, format, record->rssi, record->calibration, record->major, record->minor, record->channel); |
| bjblazkowicz | 9:9d5b0c43579b | 41 | } |
| bjblazkowicz | 9:9d5b0c43579b | 42 | |
| bjblazkowicz | 9:9d5b0c43579b | 43 | |
| bjblazkowicz | 9:9d5b0c43579b | 44 | // read next character from UART |
| bjblazkowicz | 9:9d5b0c43579b | 45 | static inline int next_char() { |
| bjblazkowicz | 9:9d5b0c43579b | 46 | while (!beacon.readable()) { |
| bjblazkowicz | 9:9d5b0c43579b | 47 | __WFE(); |
| bjblazkowicz | 9:9d5b0c43579b | 48 | } |
| bjblazkowicz | 9:9d5b0c43579b | 49 | return beacon.getc(); |
| bjblazkowicz | 9:9d5b0c43579b | 50 | } |
| bjblazkowicz | 9:9d5b0c43579b | 51 | |
| bjblazkowicz | 9:9d5b0c43579b | 52 | // Given that we have consumed the begin record character ('>'), parse |
| bjblazkowicz | 9:9d5b0c43579b | 53 | // characters until a comma is met, and confirm this is the UUID we are |
| bjblazkowicz | 9:9d5b0c43579b | 54 | // looking for. |
| bjblazkowicz | 9:9d5b0c43579b | 55 | // |
| bjblazkowicz | 9:9d5b0c43579b | 56 | // Returns true if the read UUID matches, or false otherwise. |
| bjblazkowicz | 9:9d5b0c43579b | 57 | // |
| bjblazkowicz | 9:9d5b0c43579b | 58 | static bool parse_uuid(char *uuid) { |
| bjblazkowicz | 9:9d5b0c43579b | 59 | int chars_read = 0; |
| bjblazkowicz | 9:9d5b0c43579b | 60 | |
| bjblazkowicz | 9:9d5b0c43579b | 61 | int ch = next_char(); |
| bjblazkowicz | 9:9d5b0c43579b | 62 | while (isspace(ch)) { |
| bjblazkowicz | 9:9d5b0c43579b | 63 | ch = next_char(); |
| bjblazkowicz | 9:9d5b0c43579b | 64 | } |
| bjblazkowicz | 9:9d5b0c43579b | 65 | |
| bjblazkowicz | 9:9d5b0c43579b | 66 | do { |
| bjblazkowicz | 9:9d5b0c43579b | 67 | uuid[chars_read++] = ch; |
| bjblazkowicz | 9:9d5b0c43579b | 68 | } while ((ch = next_char()) != ',' && chars_read <= UUID_LEN); |
| bjblazkowicz | 9:9d5b0c43579b | 69 | |
| bjblazkowicz | 9:9d5b0c43579b | 70 | uuid[chars_read] = '\0'; |
| bjblazkowicz | 9:9d5b0c43579b | 71 | |
| bjblazkowicz | 9:9d5b0c43579b | 72 | return chars_read == UUID_LEN && memcmp(uuid, UUID, UUID_LEN) == 0; |
| bjblazkowicz | 9:9d5b0c43579b | 73 | } |
| bjblazkowicz | 9:9d5b0c43579b | 74 | |
| bjblazkowicz | 9:9d5b0c43579b | 75 | // Parse an integer using the given radix. |
| bjblazkowicz | 9:9d5b0c43579b | 76 | static void parse_int(int *value, int radix) { |
| bjblazkowicz | 9:9d5b0c43579b | 77 | static const int BUF_SIZE = 16; |
| bjblazkowicz | 9:9d5b0c43579b | 78 | char buf[BUF_SIZE] = {0}; |
| bjblazkowicz | 9:9d5b0c43579b | 79 | int chars_read = 0; |
| bjblazkowicz | 9:9d5b0c43579b | 80 | int ch = next_char(); |
| bjblazkowicz | 9:9d5b0c43579b | 81 | |
| bjblazkowicz | 9:9d5b0c43579b | 82 | do { |
| bjblazkowicz | 9:9d5b0c43579b | 83 | buf[chars_read++] = ch; |
| bjblazkowicz | 9:9d5b0c43579b | 84 | } while ((ch = next_char()) != ',' && chars_read <= BUF_SIZE); |
| bjblazkowicz | 9:9d5b0c43579b | 85 | |
| bjblazkowicz | 9:9d5b0c43579b | 86 | *value = strtol(buf, NULL, radix); |
| bjblazkowicz | 9:9d5b0c43579b | 87 | } |
| bjblazkowicz | 9:9d5b0c43579b | 88 | |
| bjblazkowicz | 9:9d5b0c43579b | 89 | static void exec_call_thread(void const *args) |
| bjblazkowicz | 9:9d5b0c43579b | 90 | { |
| bjblazkowicz | 9:9d5b0c43579b | 91 | while(1) { |
| bjblazkowicz | 9:9d5b0c43579b | 92 | int ch = next_char(); |
| bjblazkowicz | 9:9d5b0c43579b | 93 | if (ch == '>') { |
| bjblazkowicz | 9:9d5b0c43579b | 94 | if (!parse_uuid(record.uuid)) { |
| bjblazkowicz | 9:9d5b0c43579b | 95 | continue; |
| bjblazkowicz | 9:9d5b0c43579b | 96 | } |
| bjblazkowicz | 9:9d5b0c43579b | 97 | |
| bjblazkowicz | 9:9d5b0c43579b | 98 | parse_int(&record.rssi, 10); |
| bjblazkowicz | 9:9d5b0c43579b | 99 | parse_int(&record.calibration, 10); |
| bjblazkowicz | 9:9d5b0c43579b | 100 | parse_int(&record.major, 16); |
| bjblazkowicz | 9:9d5b0c43579b | 101 | parse_int(&record.minor, 16); |
| bjblazkowicz | 9:9d5b0c43579b | 102 | parse_int(&record.channel, 10); |
| bjblazkowicz | 9:9d5b0c43579b | 103 | |
| bjblazkowicz | 9:9d5b0c43579b | 104 | console.printf("Parsed record: [uuid:%s, rssi:%d, calibration:%d, major:%d, minor:%d, channel: %d]\r\n", record.uuid, record.rssi, record.calibration, record.major, record.minor, record.channel); |
| bjblazkowicz | 9:9d5b0c43579b | 105 | |
| bjblazkowicz | 9:9d5b0c43579b | 106 | if (obs_number == 0 && obs_token_ptr == NULL) |
| bjblazkowicz | 9:9d5b0c43579b | 107 | console.printf("ERROR: obs_number: %d, obs_token_ptr: %0x%08x\r\n", obs_number, obs_token_ptr); |
| bjblazkowicz | 9:9d5b0c43579b | 108 | |
| bjblazkowicz | 9:9d5b0c43579b | 109 | obs_number++; |
| bjblazkowicz | 9:9d5b0c43579b | 110 | |
| bjblazkowicz | 9:9d5b0c43579b | 111 | static const int JSON_BUFFER_SIZE = 1024; |
| bjblazkowicz | 9:9d5b0c43579b | 112 | char json[JSON_BUFFER_SIZE] = {0}; |
| bjblazkowicz | 9:9d5b0c43579b | 113 | int json_length = 0; |
| bjblazkowicz | 9:9d5b0c43579b | 114 | encode_beacon_record(&record, json, &json_length); |
| bjblazkowicz | 9:9d5b0c43579b | 115 | |
| bjblazkowicz | 9:9d5b0c43579b | 116 | int result = sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t *)json, json_length, &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0); |
| bjblazkowicz | 9:9d5b0c43579b | 117 | console.printf("Sent to mDS: '%s', result: %d\r\n", json, result); |
| bjblazkowicz | 9:9d5b0c43579b | 118 | } |
| bjblazkowicz | 9:9d5b0c43579b | 119 | } |
| bjblazkowicz | 9:9d5b0c43579b | 120 | } |
| bjblazkowicz | 9:9d5b0c43579b | 121 | |
| bjblazkowicz | 9:9d5b0c43579b | 122 | int create_beacon_resource(sn_nsdl_resource_info_s *resource_ptr) |
| bjblazkowicz | 9:9d5b0c43579b | 123 | { |
| bjblazkowicz | 9:9d5b0c43579b | 124 | beacon.baud(115200); |
| bjblazkowicz | 9:9d5b0c43579b | 125 | static Thread exec_thread(exec_call_thread); |
| bjblazkowicz | 9:9d5b0c43579b | 126 | //nsdl_create_dynamic_resource(resource_ptr, sizeof(RESOURCE_ID) - 1, (uint8_t*)RESOURCE_ID, 0, 0, 1, &resource_cb, SN_GRS_GET_ALLOWED); |
| bjblazkowicz | 9:9d5b0c43579b | 127 | console.printf("Created beacon resource\r\n"); |
| bjblazkowicz | 9:9d5b0c43579b | 128 | return 0; |
| bjblazkowicz | 9:9d5b0c43579b | 129 | } |
