import time
import json
import smbus2
import bme280
from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse
# Azure IoT Hub connection string
CONNECTION_STRING = 'HostName=raspberry-pi-Iot.azure-devices.net;DeviceId=my-device-id;SharedAccessKey=vireMfg6lnti6NgMq3Ypj+a8tnLQX60PbAIoTJcPmEc='
# Initialize the BME280 sensor
PORT = 1
ADDRESS = 0x77 # Default I2C address of BME280
bus = smbus2.SMBus(PORT)
calibration_params = bme280.load_calibration_params(bus, ADDRESS)
# GPIO setup
import RPi.GPIO as GPIO
LEDPin = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(LEDPin, GPIO.OUT)
# Initialize variables
sending_message = False
message_id = 0
# Initialize the client
client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
def get_message():
global message_id
message_id += 1
data = bme280.sample(bus, ADDRESS, calibration_params)
message = {
"messageId": message_id,
"deviceId": "Raspberry Pi Web Client",
"temperature": data.temperature,
"humidity": data.humidity
}
return json.dumps(message), data.temperature > 30
def send_message():
if not sending_message:
return
message_content, temperature_alert = get_message()
message = Message(message_content)
message.custom_properties["temperatureAlert"] = str(temperature_alert)
print('Sending message:', message_content)
try:
client.send_message(message)
blink_led()
print('Message sent to Azure IoT Hub')
except Exception as e:
print('Failed to send message to Azure IoT Hub:', str(e))
def on_start(request):
global sending_message
print(f'Try to invoke method start({request.payload})')
sending_message = True
response_payload = {"response": "Successfully started sending message to cloud"}
response_status = 200
method_response = MethodResponse.create_from_method_request(request, response_status, response_payload)
client.send_method_response(method_response)
def on_stop(request):
global sending_message
print(f'Try to invoke method stop({request.payload})')
sending_message = False
response_payload = {"response": "Successfully stopped sending message to cloud"}
response_status = 200
method_response = MethodResponse.create_from_method_request(request, response_status, response_payload)
client.send_method_response(method_response)
def receive_message_callback(message):
blink_led()
print('Received message:', message.data.decode())
def blink_led():
GPIO.output(LEDPin, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(LEDPin, GPIO.LOW)
def main():
try:
client.connect()
client.on_method_request_received = on_method_request_received
client.on_message_received = receive_message_callback
while True:
if sending_message:
send_message()
time.sleep(2)
except KeyboardInterrupt:
print("Program stopped")
finally:
client.disconnect()
GPIO.cleanup()
def on_method_request_received(request):
if request.name == 'start':
on_start(request)
elif request.name == 'stop':
on_stop(request)
else:
response_payload = {"response": "Direct method not recognized"}
response_status = 404
method_response = MethodResponse.create_from_method_request(request, response_status, response_payload)
client.send_method_response(method_response)
if __name__ == '__main__':
main()