2013-03-01 15 views
5

Tôi đang làm việc với các thông báo đẩy với Google Cloud Messaging (GCM). Tôi có thể thiết lập máy chủ và phía máy khách sau this tutorial.Kết nối với máy chủ GCM đang chạy trên máy chủ cục bộ

Máy chủ chạy trên Apache Tomcat6.0 (máy chủ cục bộ) và trình giả lập Android trên API Google (API cấp 17). Tôi có một id người gửi và khóa API. Khi chạy từ trình mô phỏng, tôi nhận được thông báo kết nối thiết bị thành công. Sớm hơn sau đó, khi gửi tin nhắn từ máy chủ cho thấy lỗi sau.

com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 401() 
com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:211) 
com.google.android.gcm.server.Sender.send(Sender.java:125) 
com.google.android.gcm.demo.server.SendAllMessagesServlet.doPost(SendAllMessagesServlet.java:83) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

Từ các bài đăng khác, tôi hiểu sai Khóa API là thủ phạm. Nhưng trong trường hợp của tôi, tôi đảm bảo rằng tôi đang sử dụng đúng từ bảng điều khiển API.

Nhân tiện, khi tôi chạy trình mô phỏng, tôi thấy một thông báo 'gửi regId đến máy chủ'. ID đăng ký là gì? Nó không giống như id người gửi; trông giống như mã được mã hóa.

Bất kỳ đột phá nào?

EDIT

Vấn đề cuối cùng được giải quyết! Ant không xây dựng đúng tệp WAR. Vì vậy, khóa API hầu như không được cập nhật. Đó là một cơn ác mộng để phát hiện lỗi. Cảm ơn tất cả các đầu vào!

+0

Trình giả lập không hoạt động.Hãy thử với thiết bị –

+0

bất kỳ hạn chế nào về mức API của thiết bị ..? – Renjith

+0

Hoạt động trên 2,2 –

Trả lời

2

Tôi đề nghị bạn đọc hướng dẫn GCM:

GCM guide for Android

ID người gửi là một hằng số có nghĩa là sẽ được sử dụng trong comunication giữa GCM và máy chủ của bạn. RegsitratiomID (regID) được quản lý bởi dịch vụ GCM khi điện thoại của bạn đăng ký dịch vụ của mình.

Một định nghĩa tốt hơn: http://developer.android.com/google/gcm/gcm.html

Sender ID:

Một số dự án bạn có được từ bảng điều khiển API, như mô tả trong Bắt đầu. ID người gửi được sử dụng trong quá trình đăng ký để xác định ứng dụng Android được phép gửi tin nhắn tới thiết bị.

đăng ký ID:

Một ID do các máy chủ GCM vào ứng dụng Android cho phép nó nhận tin nhắn. Khi ứng dụng Android có ID đăng ký, ứng dụng sẽ gửi nó tới máy chủ ứng dụng của bên thứ ba, sử dụng nó để xác định từng thiết bị đã đăng ký nhận tin nhắn cho một ứng dụng Android cụ thể. Nói cách khác, ID đăng ký được gắn với một ứng dụng Android cụ thể đang chạy trên một thiết bị cụ thể.

0

ID người gửi là số dự án bạn đã tạo trong bảng điều khiển của Google.

ID đăng ký

Khi đăng ký ứng dụng của bạn để GCM nó được ID đăng ký. Để gửi thông báo, ID đăng ký này sẽ được GCM sử dụng để nhận dạng thiết bị của bạn + ứng dụng của bạn. Ứng dụng android của bạn sẽ gửi ID đăng ký này đến máy chủ của bạn để khi máy chủ muốn gửi cho bạn một tin nhắn có thể gắn thẻ với ID đăng ký và do đó GCM có thể gửi đến đúng thiết bị & ứng dụng phù hợp.

Chẩn đoán xem ID đăng ký có được chia sẻ thành công với máy chủ (Nhận/Đăng) hay không, trừ khi bạn không nhận được bất kỳ tin nhắn nào.

2

Tài khoản người gửi mà bạn đang cố gắng sử dụng để gửi thư không thể được xác thực. Nguyên nhân có thể là:

  1. Thiếu tiêu đề cấp quyền hoặc có cú pháp không hợp lệ.
  2. Số dự án không hợp lệ được gửi dưới dạng khóa.
  3. Khóa hợp lệ nhưng đã tắt dịch vụ GCM.
  4. Yêu cầu bắt nguồn từ máy chủ không có trong danh sách trắng trong Khóa máy chủ IP.

Kiểm tra mã thông báo bạn đang gửi bên trong tiêu đề Cấp quyền là khóa API chính xác được liên kết với dự án của bạn. Bạn có thể kiểm tra tính hợp lệ của khóa API của bạn bằng cách chạy lệnh sau:

api_key=YOUR_API_KEY 

curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"ABC\"]}" 

Nếu bạn muốn xác nhận tính hợp lệ của một ID đăng ký, bạn có thể làm như vậy bằng cách thay thế "ABC" với ID đăng ký. Xảy ra khi mã trạng thái HTTP là 401.

+0

Tôi có một vấn đề tương tự w/một phụ trợ mới. Phần lạ là curl hoạt động, nhưng trang thử nghiệm được tạo tự động với cùng api_key cho lỗi 401 khi gửi tin nhắn GCM. Khó hiểu :-P – kenyee