樹莓

2015-12-10 66 views
0

發送消息到Azure的IOT中心我需要從安裝在我的覆盆子一個通用的應用程序將消息發送到Azure的IOT中心(https://azure.microsoft.com/it-it/services/iot-hub/)。我必須使用HTTP協議,因爲樹莓不支持AMQP。 我使用下面的代碼:樹莓

public sealed partial class MainPage : Page 
{ 
    private DispatcherTimer _timer = null; 
    private DeviceClient _deviceClient = null; 
    private const string _deviceConnectionString = "<myConnectionString>"; 

    public MainPage() 
    { 
     InitializeComponent(); 

     _deviceClient = DeviceClient.CreateFromConnectionString(_deviceConnectionString, TransportType.Http1); 

     _timer = new DispatcherTimer(); 
     _timer.Interval = TimeSpan.FromSeconds(5); 
     _timer.Tick += _timer_Tick; 
     _timer.Start(); 
    } 

    private async void _timer_Tick(object sender, object e) 
    { 
     string msg = "{deviceId: 'myFirstDevice', timestamp: " + DateTime.Now.Ticks + " }"; 

     Message eventMessage = new Message(Encoding.UTF8.GetBytes(msg)); 
     await _deviceClient.SendEventAsync(eventMessage); 
    } 
} 

SendEventAsync給我:

Exception thrown: 'Microsoft.Azure.Devices.Client.Exceptions.IotHubCommunicationException' in mscorlib.ni.dll

Message: {"An error occurred while sending the request."} 

我已經包括在我的項目Microsoft.AspNet.WebApi.Client如下記載:https://github.com/Azure/azure-iot-sdks/issues/65沒有結果。

"dependencies": { 
    "Microsoft.AspNet.WebApi.Client": "5.2.3", 
    "Microsoft.Azure.Devices.Client": "1.0.0-preview-007", 
    "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" 
}, 
"frameworks": { 
    "uap10.0": {} 
} 

如果我在控制檯應用程序中嘗試SAME代碼,它按預期工作。

+0

沒有你的項目有什麼樣的能力? – danvy

+0

只有'互聯網(客戶端)' – danyolgiax

+0

您可以嘗試使用以下代碼手動發送事件: https://github.com/danvy/sigfox/blob/master/src/SigfoxEventSimulator/Program.cs 您可以創建您的使用SAS令牌這個工具: http://danvy.tv/sas-token-generator.html – danvy

回答

0

搜索後幾個小時,我發現一個硬件問題。我的Raspberry試圖使用未配置的Wi-Fi適配器發送請求,而對於使用網絡電纜的所有其他請求。去掉加密狗的確有竅門。

+1

在這個筆記上,我發現如果有多個網絡連接可供選擇,我會感到困惑。 –

+0

我現在面對與我的Raspberry Pi 3相同的問題,但問題是我沒有使用任何WiFi加密狗,但也許內部的WiFi組件導致類似的問題? – ffffff01

+0

如果內部樹莓datime未設置爲現在,您可能會遇到同樣的問題!我的過去是2小時!看看這裏http://stackoverflow.com/questions/32828332/how-to-use-powershell-to-set-the-time-on-a-remote-device – danyolgiax

0

@danvy是正確的,你需要生成一個SAS令牌,這裏是一個簽名生成https://github.com/sandrinodimattia/RedDog/releases

可能有多種方式發送事件,您正在使用HTTP,看看這個樣本

// Generate a SAS key with the Signature Generator.: 
var sas = "SharedAccessSignature sr=https%3a%2f%2freddogeventhub.servicebus.windows.net%2ftemperature%2fpublishers%2flivingroom%2fmessages&sig=I7n%2bqlIExBRs23V4mcYYfYVYhc6adOlMAeTY9VM9kNg%3d&se=1405562228&skn=SenderDevice"; 

// Namespace info. 
var serviceNamespace = "myeventhub"; 
var hubName = "temperature"; 
var deviceName = "livingroom"; 

// Create client. 
var httpClient = new HttpClient(); 
httpClient.BaseAddress = 
      new Uri(String.Format("https://{0}.servicebus.windows.net/", serviceNamespace)); 
httpClient.DefaultRequestHeaders 
      .TryAddWithoutValidation("Authorization", sas); 

Console.WriteLine("Starting device: {0}", deviceName); 

// Keep sending. 
while (true) 
{ 
    var eventData = new 
    { 
     Temperature = new Random().Next(20, 50) 
    }; 

    var postResult = httpClient.PostAsJsonAsync(
      String.Format("{0}/publishers/{1}/messages", hubName, deviceName), eventData).Result; 

    Console.WriteLine("Sent temperature using HttpClient: {0}", 
      eventData.Temperature); 
    Console.WriteLine(" > Response: {0}", 
      postResult.StatusCode); 
    Console.WriteLine(" > Response Content: {0}", 
      postResult.Content.ReadAsStringAsync().Result); 

    Thread.Sleep(new Random().Next(1000, 5000)); 
} 

看看這篇文章瞭解更多詳情http://fabriccontroller.net/iot-with-azure-service-bus-event-hubs-authenticating-and-sending-from-any-type-of-device-net-and-js-samples/

+0

我使用的是新Azure的物聯網中心(https://azure.microsoft.com/it-it/services/iot -hub /),我跟着微軟的入門指南這裏:https://azure.microsoft.com/it-it/develop/iot/get-started/ – danyolgiax

0

嘗試連接字符串設定爲您的設備(_deviceConnectionString)使用本教程

https://github.com/Azure/azure-iot-sdks/blob/master/tools/DeviceExplorer/doc/how_to_use_device_explorer.md

你可以手工使用從物聯網中心獲得直接或通過物聯網套房嚮導創建的儀表盤的信息做到這一點。它看起來像這樣

_deviceConnectionString =「HostName = YourIoTHubName.azure-devices.net; DeviceId = YourDeviceId; SharedAccessKey = YourDeviceSharedAccessKey」;

+0

連接字符串工作正常使用一個控制檯應用程序相同的代碼。 – danyolgiax

+0

您的應用程序是否在您的電腦上運行? – danvy

+0

我已經添加了解決方案。這是一個硬件問題。 – danyolgiax

0

你生成使用CreateDeviceIdentity工具,設備ID和設備密鑰是否正確? 下面是指南:https://blogs.windows.com/buildingapps/2015/12/09/windows-iot-core-and-azure-iot-hub-putting-the-i-in-iot/

+0

後續文章一步一步地複製粘貼代碼和相同的錯誤! '發送請求時發生錯誤。'內部異常是:'{「異常來自HRESULT:0x80072F05」}' – danyolgiax

+0

你可以在GitHub或其他地方與我分享代碼嗎? –

+0

我添加了解決方案,這是一個硬件問題。謝謝 – danyolgiax