bool unabto_buffer_test(void) { char * raw_test_string = "asjdhc#21?(!?(92814skzjbcasa"; uint8_t data[7 + 2 + strlen(raw_test_string)]; unabto_buffer buf, raw_string_buf; buffer_write_t w_buf; buffer_read_t r_buf; uint32_t t32; uint16_t t16; uint8_t t8; uint8_t raw_string_data[strlen(raw_test_string) + 1]; buffer_init(&raw_string_buf, (uint8_t*)raw_test_string, strlen(raw_test_string)); buffer_init(&buf, data, sizeof(data)); buffer_write_init(&w_buf, &buf); if (! (buffer_write_uint32(&w_buf, 0x12345678) && buffer_write_uint16(&w_buf, 0x1234) && buffer_write_uint8(&w_buf, 0x12) && buffer_write_raw(&w_buf, &raw_string_buf) ) ) { NABTO_LOG_ERROR(("Buffer write test failed")); return false; } buffer_read_init(&r_buf, &buf); memset(raw_string_data, 0, sizeof(raw_string_data) + 1); buffer_init(&raw_string_buf, raw_string_data, sizeof(raw_string_data)); bool t = false; if (! ( buffer_read_uint32(&r_buf, &t32) && t32 == 0x12345678 && buffer_read_uint16(&r_buf, &t16) && t16 == 0x1234 && buffer_read_uint8(&r_buf, &t8) && t8 == 0x12 && (t = buffer_read_raw(&r_buf, &raw_string_buf)) && buffer_get_size(&raw_string_buf) == strlen(raw_test_string) && 0 == strncmp((char*)buffer_get_data(&raw_string_buf), raw_test_string, strlen(raw_test_string)) )) { NABTO_LOG_ERROR(("Failed read test failed")); return false; } if (buffer_read_uint32(&r_buf, &t32) || buffer_read_uint16(&r_buf, &t16) || buffer_read_uint8(&r_buf, &t8) || buffer_read_raw(&w_buf, &raw_string_buf) || buffer_write_uint32(&w_buf, 0x12345678) || buffer_write_uint16(&w_buf, 0x1234) || buffer_write_uint8(&w_buf, 0x12) || buffer_write_raw(&w_buf, &raw_string_buf) ) { NABTO_LOG_ERROR(("Some function should have returned false but returned true")); return false; } return true; }
void arp_reply(struct buffer* b, char* mac, uint32_t to) { buffer_flush(b); eth_write_header(b, mac_addr, mac, ETH_ARP); buffer_write_uint16(b, 1); buffer_write_uint16(b, ETH_IPV4); buffer_write_uint8(b, 6); buffer_write_uint8(b, 4); buffer_write_uint16(b, 2); buffer_write(b, 6, mac_addr); buffer_write(b, 4, ip_addr); buffer_write(b, 6, mac); buffer_write_uint32(b, to); }
application_event_result weather_station_application(application_request* request, buffer_read_t* read_buffer, buffer_write_t* write_buffer) { switch (request->queryId) { case 1: /* * <query name="house_temperature" id="1" * template="house_temperature_template_overrule.tpt"> * <request> * <parameter name="sensor_id" type="uint32"/> * </request> * <response> * <parameter name="temperature" type="int32"/> * </response> * </query> */ { int32_t temp; uint32_t ix; // read 4 bytes from the input buffer if (!buffer_read_uint32(read_buffer, &ix)) return AER_REQ_TOO_SMALL; // write 4 bytes to the output buffer temp = getTemperature(ix); if (!buffer_write_uint32(write_buffer, temp)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 2: /* * <query name="wind_speed" id="2"> * <request> * </request> * <response> * <parameter name="speed_m_s" type="uint32"/> * </response> * </query> */ if (!buffer_write_uint32(write_buffer, getWindSpeed())) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; case 3: /** * <query name="weather_station" description="Weather station" id="3"> * <request> * </request> * <response> * <parameter name="temperature"/> * <parameter name="windspeed"/> * <parameter name="humidity"/> * </response> * </query> */ if (buffer_write_uint32(write_buffer, getTemperatureSimulated()) && buffer_write_uint32(write_buffer, getWindSpeedSimulated()) && buffer_write_uint32(write_buffer, getHumiditySimulated())) { return AER_REQ_RESPONSE_READY; } else { return AER_REQ_RSP_TOO_LARGE; } case 4: return AER_REQ_RESPONSE_READY; } /** * if no opcode matched return it as an error */ return AER_REQ_INV_QUERY_ID; }
/***************** The uNabto application logic ***************** * This is where the user implements his/her own functionality * to the device. When a Nabto message is received, this function * gets called with the message's request id and parameters. * Afterwards a user defined message can be sent back to the * requesting browser. ****************************************************************/ application_event_result application_event(application_request* request, buffer_read_t* read_buffer, buffer_write_t* write_buffer) { switch(request->queryId) { case 1: { /** Get acceleration data */ extern int16_t gAccData[3]; uint16_t acc_x; uint16_t acc_y; uint16_t acc_z; // Get accelerometer data and calculate yaw, pitch and roll with offset Accelerometer_Get(); acc_x = gAccData[0] + 0xFF; acc_y = gAccData[1] + 0xFF; acc_z = gAccData[2] + 0xFF; // Write back data if (!buffer_write_uint16(write_buffer, acc_x)) return AER_REQ_RSP_TOO_LARGE; if (!buffer_write_uint16(write_buffer, acc_y)) return AER_REQ_RSP_TOO_LARGE; if (!buffer_write_uint16(write_buffer, acc_z)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 2: { /** Get temperature data */ uint16_t temp; temp = Temperature_Get(); // Write back data if (!buffer_write_uint16(write_buffer, temp)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 3: { /** Get light level */ uint16_t light; light = LightSensor_Get(); // Write back data if (!buffer_write_uint16(write_buffer, light)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 4: { /** Get potentiometer data */ uint32_t pot; pot = Potentiometer_Get(); // Write back data if (!buffer_write_uint32(write_buffer, pot)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 5: { /** Get button status */ uint8_t button1; uint8_t button2; uint8_t button3; button1 = Switch1IsPressed(); button2 = Switch2IsPressed(); button3 = Switch3IsPressed(); // Write back data if (!buffer_write_uint8(write_buffer, button1)) return AER_REQ_RSP_TOO_LARGE; if (!buffer_write_uint8(write_buffer, button2)) return AER_REQ_RSP_TOO_LARGE; if (!buffer_write_uint8(write_buffer, button3)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 6: { /** Get sound level */ uint32_t sound; sound = Microphone_Get(); // Write back data if (!buffer_write_uint32(write_buffer, sound)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } case 7: { /** Set LED */ uint16_t led; // Read parameters in request if (!buffer_read_uint16(read_buffer, &led)) return AER_REQ_TOO_SMALL; if (led == 1) { led_all_on(); } else { led_all_off(); } // Write back data if (!buffer_write_uint16(write_buffer, led)) return AER_REQ_RSP_TOO_LARGE; return AER_REQ_RESPONSE_READY; } } return AER_REQ_INV_QUERY_ID; }